Shell脚本实战24-模拟keepalived软件高可用

1. 需求

请在LVS服务端备用节点上,模拟keepalived vrrp功能,监听主节点,如果主节点不可访问,则启动备节点并配置LVS服务,接管主节点的资源并对用户提供服务(提醒:注意ARP缓存)

2. 分析

此题实际上要实现两部分功能:

  • 检测主节点是否宕机,可以使用ping或nmap命令。
  • 如果主节点宕机,则调用管理LVS的服务脚本,执行LVS配置。

3. 实现

3.1. 管理LVS服务的脚本

假如该脚本名字为/etc/init.d/lvs

其内容如下(参考脚本实战21):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/bin/bash
. /etc/init.d/functions
VIP=10.0.0.3
INTERFACE=eth0
SubINTERFACE=${INTERFACE}:`echo $VIP | cut -d. -f4`
PORT=80
GW=10.0.0.254
RETVAR=0
IP=/sbin/ip
ROUTE=/sbin/route
IPVSADM=/sbin/ipvsadm
ARPING=/sbin/srping
RIPS=( #<==定义realserver节点IP数组
10.0.0.7
10.0.0.8
)
function usage()
{
echo "Usage : $0 {start|stop|restart}"
return 1
}
function ipvsStart() #<==配置ipvs
{
$IP addr add $VIP/24 dev ${INTERFACE} label $SubINTERFACE #<==添加VIP
$ROUTE add -host $VIP dev $SubINTERFACE #<==添加VIP对应主机路由
$IPVSADM -C
$IPVSADM -A -t $VIP:$PORT -s wrr -p 60 #<==生成ipvs实例
for ((i=0; i<`echo ${#RIPS[*]}`; i++))
do
$IPVSADM -a -t $VIP:$PORT -r ${RIPS[$i]}:$PORT -g -w 1
#<==添加节点
done
RETVAR=$?
# update MAC
$ARPING -c 1 -I ${INTERFACE} -s $VIP $GW &> /dev/null #<==arp表
if [ $RETVAR -eq 0 ]
then
action "Ipvsadm started." /bin/true
else
action "Ipvsadm started." /bin/false
fi
return $RETVAR
}
function ipvsStop()
{
$IPVSADM -C
$IPVSADM -Z
$IP addr del $VIP/24 dev ${INTERFACE} label $SubINTERFACE &> /dev/null
#<==删除VIP
RETVAR=$?
$ROUTE del -host $VIP dev $SubINTERFACE &> /dev/null #<==删除路由
$ARPING -从1 -I ${INTERFACE} -s $VIP $GW > /dev/null 2>&1 #<==更新arp表
if [ $RETVAR -eq 0 ]
then
action "Ipvsadm stopped." /bin/true
else
action "Ipvsadm stopped." /bin/false
fi
return $RETVAR
}
main()
{
#judge argv num
if [ $# -ne 1 ]
then
usage $0
fi
case "$1" in
start)
ipvsStart
;;
stop)
ipvsStop
;;
restart)
ipvsStop
ipvsStart
;;
*)
usage $0
;;
esac
}
# start operating
main $*

3.2. 监测主节点是否宕机及管理LVS的服务脚本

脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash
VIP=10.0.0.3
PORT=80
ipvs_tools=`rpm -qa ipvsadm | wc -l`
if [ $ipvs_tools -ne 1 ]
then
yum install ipvsadm -y
fi
while true
do
ping w2 -c2 ${VIP} > /dev/null 2>&1
if [ $? -ne 0 ]
then
/bin/sh /etc/init.d/lvs start > /dev/null 2>&1
else
/bin/sh /etc/init.d/lvs stop > /dev/null 2>&1
fi
sleep 5
done

0%